AMD Zen-2 物理设计总结

AMD Zen2,一个巨大 规模的巨无霸。采用的是先进的7nm工艺。

而一个更矮的6T的标准单元库,导致的更高的逻辑密度和实现难度。

相对于14nm,7nm导致线上电阻的增大。因此花了很多力气在net的优化上,例如,先择高层金属用于关键net的绕线(线宽减少主要是底层金属)。用via ladder降低线上的电阻以及解决EM的问题。

阅读本文,感受一下超大型芯片以及先进工艺所带来的挑战

Last year AMD introduced the Zen 2 microarchitecture, the company’s second major iteration of its Zen design. Zen 2 brought significant architectural changes at both the core level and the full SoC level. Undoubtedly, a big part of this success can be directly attributed to the company’s decision to dive headfirst into TSMC’s leading-edge 7-nanometer node. The move to TSMC 7-nanometer is a pretty big aggressive move, not only because it’s such a large technology shift, but also because of the new physical challenges it brings along with it – challenges that required the entire ecosystem – such as the foundry and CAD and EDA vendors – to collaborate on resolving those issues. At the recent ISSCC 2020 conference, AMD delved into some of those challenges in a little more detail.

Compared to AMD’s original Zen process which was the 14-nanometer FinFET process by GlobalFoundries, TSMC 7-nanometer represents a more-than-one generational leap in terms of density which provided the designers with significantly higher transistor budget per fixed area of silicon. Additionally, AMD switched from using a high-performance cell library to using TSMC 6T library which brought a whole new set of challenges especially when it comes to routing a high-performance SoC. We have covered both processes extensively on WikiChip so for brevity’s sake a short comparison is provided below.

Perhaps the biggest difference is the switch from a fairly tall cell to a high-density short cell. Those of you who are a bit more familiar with the previously-reported Zen numbers may notice that there are a couple of discrepancies between what’s shown in the table and what AMD previously reported. The reason is that actually AMD used both 10.5T and 9T cells. The table above, and the data AMD provided, is just an assortment of key features. It’s also worth noting that AMD is using a slightly more relaxed metal stack as compared to the usual high-density metal stack so actually the overall density is a bit more relaxed than the most aggressive 6T density.

When looking at the metal stack, the 7-nanometer process offered two additional Cu layers (though later Zen also added another layer). The table below shows the pitch spacing for each of the metal lines in the stack, normalized by the respective node gate. Inside the standard cell, TSMC N7 offers a local cell interconnect layer (M0) which they did not have before. The metal 4 to 7 layers are slightly larger, and the metal 10-11 are the new metal layers that were added in that node.

One of the challenges that needed to be addressed when they transitioned from 14 nm to 7 nm is the patterning of the lowest layers. We have talked about those differences in priors articles. In AMD’s talk, Teja Singh reiterated some of those new restrictions. Since the lower-level metals are aggressively multi-patterned, the bidirectionality that was offered by earlier nodes is now forbidden in N7. Simple layer jogs now meant you have to climb up the stack, go to where you want to go, and then go back down. This change also introduces some stray electrical properties into the cell such as extra RC.

The shorter cells gave AMD unique challenges as well. Shorter cells have the benefits of power and density, but at the same time, they come at significant complexity to place and routing. This is compounded by the unidirectionality requirements and the tight DRC rules along with the significantly higher wire resistance. Making the cells very wide, you end stressing the M1 power grid. This means that in Zen 2, large cells such as a multi-bit flip-flop ends up going taller. Upwards of eight-row tall cells is not uncommon in Zen 2. The downside of this approach is that you end up with higher fragmentation, lowering the utilization of your area (you end up with lots of dead space). Teja says that AMD had to work closely with the EDA tools providers to work through those challenges. One example was the need to do multiple passes and filling the empty areas with smaller components. Additionally, AMD implemented a number of different power grid options, allowing for more fine-grained optimizations such as an EM/IR dense grid for critical areas and a light-grid for less critical areas.

Fighting The Resistance

With the tighter metal pitches, 7nm brought additional challenges when it came to resistance. This isn’t new. Resistance has been a challenge for quite some time. Recent nodes have shrunk the metal pitches to a point where the barrier and liners are pretty much as thin as we can make them therefore what’s actually shrinking the copper core itself. Less copper means the barriers and liners are making up a bigger part of the wire. In other words, as the copper core continues to shrink without other aspects of the wire, the overall resistivity of the wire will continue to rise.

What’s new in 7-nanometer is that it’s accelerating – and fast. While the capacitance is still largely under control and even in 7 nm the normalized capacitance across all the metal layers is fairly uniform, the resistance is not. Far from it. Going from 16 nm to 7 nm you are looking more than 3x in your metal R. And by the way, from 7 nm to 5 nm designers are reporting a similar jump in the line resistance. AMD showed a nice graph of their Zen 2 normalized resistance and capacitance and the differences are quite large. If you look at the M2 and M3 layers, you are looking at 2.3x and 3.2x the normalized resistance. The lack of uniformity of the normalized resistance of those two layers alone is throwing a monkey wrench into assumptions that the EDA tools are making. Now you get pretty bad results due to pre-route and post-route miscorrelations.

The underestimation of the M2-M3 normalized resistance is shown in the graph below which compares the route timing to the ClockTreeSynthesis. The actual values are not really important but what’s clear from the graph is that there are a lot of routing paths that were too optimistically estimated in terms of delays. Those paths have to be further optimized. Again, resolving these issues required close corporation with CAD and EDA vendors. The solution was introducing a new statistical method that took into account the placement details along with the driver location to generate better routing estimates. The results are quite good, the deviation is a lot tighter and the routing paths is leaned towards being slightly pessimistic which is where you’d want to be. It’s also worth noting that the graph shown is not the final product but rather a snapshot in time.

Wire Engineering

In the past, we have talked about the wire resistivity challenges that are impacting all recent leading-edge process technology designs. One thing we normally don’t have is visibility as to how profound this really is in real high-performance SoCs. The delay of the few bottom layers now contributes more to the wire delay than all the rest of the layers. In fact, the wire delay contribution at the M3 layer and below has increased from 36% on Zen to 59% on Zen 2. The changes meant there was a need to get EDA tools to understand this problem and being able to model it and optimize routing to avoid those issues. If that wasn’t enough, AMD was also targeting higher Fmax, compounding the wire problems. Manual buffering and pre-routing critical nets works, but only for a tiny subset of the chip. A more general fix was needed.

As a more generalized solution, AMD went with via ladders. We have seen TSMC talk about this a lot when it comes to their 5-nanometer node as this technique becomes even more important. TSMC calls them Via Pillars (VPs). The technique itself is not particularly new, but its ubiquitousness in new designs due to wire constraints is. Ladders are tightly-spaced identical via pairs placed in the main direction of the metal lines in a lattice structure.

The parallel mesh of wires and vias helps reduce the via resistance and the overall metal resistance at the driver, allowing to get to the higher metals faster. Similarly to the power grid, AMD had multiple implementations of the ladders – one for high performance driving long nets and one for high activity with extra electromigration mitigations.

Growing Challenges Ahead

AMD leveraging TSMC 7-nanometer process significantly boosted their capabilities in terms of what they could achieve. The catch, of course, is that the highly compelling advantages are not free. Far from it. They come with serious physical design challenges that required an ecosystem-wide collaboration from AMD, TSMC, CAD, and EDA vendors to resolve. The result is clearly worth the effort as Zen 2 delivers substantial improvement in both absolute performance and power. Looking further, AMD next-generation, Zen 3, will be leveraging TSMC 7nm+ which is an EUV-based process. That node is not a density play but instead offer a cost, learning, and refinement advantages. It’s possible that some of the challenges from N7 are actually a bit more relaxed with 7+. One such restriction is the bidirectionality constraint. Samsung did just that with their 7LPP EUV process. Unfortunately, such benefits will be very short-lived. With Zen 4 likely utilizing TSMC 5 nanometer node, the challenges from N7 will only be exacerbated.

原文链接:https://fuse.wikichip.org/news/3320/7nm-boosted-zen-2-capabilities-but-doubled-the-challenges/

作者:白山头
来源:https://mp.weixin.qq.com/s/zf…
作者微信公众号

相关文章推荐

  • block与top的时序差异分析
  • 进一步理解芯片的电压
  • 你可能不知道的leakage功耗计算

更多IC设计技术干货请关注IC设计技术专栏。

历史上的重大软件BUG启示录 第4篇—Google的疏忽

很多的软件Bug源自于输入错误,即便像Google这样的国际大公司。

在Google上搜索的时候,有些结果列表项中带有一条警告,表明Google认为它带有恶意代码。
如果你在2009年1月31日一大早使用Google搜索的话,你就会看到,在那天早晨55分钟的时间内,Google的搜索结果标明每个站点对你的PC都是有害的。这涉及到整个Internet上的所有站点,包括Google自己的所有站点和服务;几乎全世界的Google访问者都受到了影响,无论中文站点还是英文站点。
由于Google认为所有搜索结果都是有害的,所以点击搜索结果的链接后,Google会弹出警告信息,提示该网站可能会损害用户计算机并禁止直接访问。只能将网站地址粘贴到地址栏中才能打开这个网站!
  
这个重大的错误使得Google搜索引擎实际上处于瘫痪的状态。
随后,Google修复了这个BUG,并在博客披露了这次BUG的技术细节。
Google的恶意网站检测功能是和一家非盈利组织StopBadware.org合作,通过在这个组织给出的已知恶意网站名单列表上查找,从而识别出危险站点。这个组织的恶意网站名单是通过人工审核并添加的,在1月31日早晨,对这个列表的更新意外地包含了一条斜杠(“/”)。所有的URL都包含一条斜杠,并且,反恶意网站检测功能把这条斜杠理解为所有的URL都是可疑的,因此,它愉快地对搜索结果中的每个站点都添加一条警告。
很少见到一个简单的输入错误带来的结果如此奇怪、影响如此广泛,但程序就是这样,容不得一丝疏忽。

更值得考虑的是,如果Google恶意网站检测程序对URL合法性进行合理检测,很可能会避免这次人为疏忽带来的影响,并且能提醒恶意网站名单添加者:您输入的URL非法,非法URL位于名单列表的第x行!
一个程序是否健壮,跟程序架构和算法有关、跟严格测试有关,更跟程序员的素养和经验有关。程序员对防御性编程思想的理解程度,对测试的重视程度,在很大方面决定了程序抵御异常情况的能力。

普通与优秀之间,隔着难以逾越的思想鸿沟。

相关阅读

[历史上的重大软件BUG启示录 第3篇—价值5亿美元的简单复用
嵌入式系统](https://aijishu.com/a/1060000…
历史上的重大软件BUG启示录 第2篇—心脏滴血

作者:朱工
首发博客:https://freertos.blog.csdn.net/article/details/52431476
关注FreeRTOS从基础到高级专栏,即时收取FreeRTOS系列文章。

云芯一号教程 – MySQL集群搭建教程

  对于一个服务系统来说,单一的MySQL数据库服务器风险巨大。如果这台服务器出现宕机或者异常错误,会导致整个服务不可用,甚至导致不可恢复的数据丢失。另外随着业务量的加大,单个数据库服务器肯定会出现无法满足访问需求的情况。因此一般需要搭建MySQL数据库集群来保证数据库服务器的高可用性和可扩展性。
  MySQL数据库集群方案有多种,适应不同的使用场景和发展阶段,常用的方案有Replication主从架构、DBProxy、MHA+ProxySQL、Zookeeper等。一般业务的起步阶段,可以先配置Replication主从架构,后续根据业务的增长来调整MySQL数据库集群方案。
  下面我们来搭建MySQL的Replication主从架构。

1.配置MySQL多实例
  最基本的Replication主从架构需要一主一从两台服务器。我们在单个设备上配置多实例来启动两个MySQL实例,来配置一主一从的Replication架构。
2.1 创建多实例数据存放目录
  配置MySQL多实例无法使用安装时默认的配置,还需要创建目录来存放每个实例的数据库文件。
  我们在3306和3307两个端口上启动MySQL实例,因此在”/home/jishu”目录下创建mysql目录,并分别创建3306和3307两个子目录分别存放两个实例的数据。目录创建完成后,还需要修改mysql目录的用户权限给mysql用户。

  jishu@Jishu:~$ mkdir -p mysql/3306/data
  jishu@Jishu:~$ mkdir -p mysql/3307/data
  jishu@Jishu:~$ sudo chown -R mysql:mysql mysql
  jishu@Jishu:~$ cd mysql
  jishu@Jishu:~/mysql$ ls
  3306  3307

2.2 初始化多实例数据库
  数据库存放目录创建好之后,在对应的目录中初始化数据库。

  jishu@Jishu:~$ sudo mysqld --initialize-insecure --basedir=/usr --datadir=/home/jishu/mysql/3306/data/ --user=mysql
  jishu@Jishu:~$ sudo mysqld --initialize-insecure --basedir=/usr --datadir=/home/jishu/mysql/3307/data/ --user=mysql

  数据库初始化命令中的参数含义为:
  initialize-insecure: 表示初始化时生成空密码,否则会生成随机密码
  basedir: 表示MySQL的安装目录
  datadir: 表示数据存放目录
  user: 表示mysqld服务的运行用户

2.3 创建多实例配置文件
  我们用mysqld_multi命令来启动多实例。在mysql目录下创建MySQL多实例配置文件my.cnf。

  [mysqld_multi]
  mysqld     = /usr/bin/mysqld_safe
  mysqladmin = /usr/bin/mysqladmin
  user       = root
  password   = 123456
  log        = /home/jishu/mysql/mysqld_multi.log
  
  [mysqld1]
  port                      = 3306
  socket                    = /home/jishu/mysql/3306/mysql.sock
  pid_file                  = /home/jishu/mysql/3306/mysql.pid
  basedir                   = /usr
  datadir                   = /home/jishu/mysql/3306/data/
  
  # LOGGING
  long_query_time           = 5
  slow_query_log            = 1
  log_error                 = /home/jishu/mysql/3306/error.log
  slow_query_log_file       = /home/jishu/mysql/3306/slow_query.log
  log_warnings              = 1
  
  # INNODB
  innodb_data_home_dir      = /home/jishu/mysql/3306/data
  innodb_buffer_pool_size   = 64M
  innodb_log_file_size      = 64M
  innodb_data_file_path     = ibdata1:12M:autoextend:max:64M
  
  # REPLICATION
  server-id                 = 3306
  log-bin                   = /home/jishu/mysql/3306/mysql-binlog
  binlog-do-db              = musics
  
  [mysqld2]
  port                      = 3307
  socket                    = /home/jishu/mysql/3307/mysql.sock
  pid_file                  = /home/jishu/mysql/3307/mysql.pid
  basedir                   = /usr
  datadir                   = /home/jishu/mysql/3307/data/
  
  # LOGGING
  long_query_time           = 5
  slow_query_log            = 1
  log_error                 = /home/jishu/mysql/3307/error.log
  slow_query_log_file       = /home/jishu/mysql/3307/slow_query.log
  log_warnings              = 1
  
  # INNODB
  innodb_data_home_dir      = /home/jishu/mysql/3307/data
  innodb_buffer_pool_size   = 64M
  innodb_log_file_size      = 64M
  innodb_data_file_path     = ibdata1:12M:autoextend:max:64M
  
  # REPLICATION
  server-id                 = 3307
  log-bin                   = /home/jishu/mysql/3307/mysql-binlog

  配置文件中配置了mysqld1和mysqld2两个实例的参数。INNODB节中的buffer size可以根据需要进行调整。REPLICATION节中的参数用于配置Replication主从架构,其中server-id字段表示各个实例的id,必须唯一,我们直接取各个实例的端口号为id;log-bin字段启用binary log文件,指示文件路径。

2.3 启动多实例
  我们用mysqld_multi命令来启动多实例。启动前需要用ps命令确认一下是否有MySQL进程启动,如果有的话,需要先把MySQL服务停掉。

  jishu@Jishu:~/mysql$ ps -A | grep "mysql"
  jishu@Jishu:~/mysql$ sudo mysqld_multi --defaults-file=./my.cnf  start

  此时,启动不成功,会出现error.log创建权限的错误,按照配置文件中的error.log路径,手动创建error.log文件,并赋予mysql用户权限后,重新启动。

  多实例启动后,我们用lsof命令看看3306和3307端口的服务器是否已经启动。

  jishu@Jishu:~/mysql$ sudo apt-get install lsof
  jishu@Jishu:~/mysql$ sudo lsof -i:3306
  COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  mysqld  7944 mysql   26u  IPv4 244417      0t0  TCP localhost:mysql (LISTEN)
  jishu@Jishu:~/mysql$ sudo lsof -i:3307
  COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  mysqld  7948 mysql   26u  IPv4 244416      0t0  TCP localhost:3307 (LISTEN)

  可以看到两个端口上的MySQL实例都正常启动。

3.配置Replication主从架构
  Replication是通过binary log文件同步主数据库(Master)上的所有改变到从数据库(Slave)。

  Replication主从复制过程为:
  1) 数据发生变化时,Master将数据变更的事件记录到binary log文件;
  2) Master发送信号,唤醒Dump线程,通知有新事件产生;
  3) Dump线程将新事件发送给Slave的I/O线程;
  4) Slave的I/O线程将接受到事件记录到relay log文件;
  5) Slave的SQL线程从relay log文件中读取事件;
  6) Slave的SQL线程执行读取的事件,从而实现备库数据的更新。
  从上面的过程来看,Replication是一个异步过程,会导致在同一时间点从库上的数据可能与主库的不一致,并且无法保证主备之间的延迟,这是Replication架构的一个缺陷。配置为读写分离的服务,有时候在主数据库上写入数据后,从从库上读数据失败,就是这个原因。

3.1 指定连接数据库实例的用户名
  MySQL实例正常启动后,在3306和3307目录中会分别生成连接两个数据库实例的socket文件,使用mysqladmin给两个数据库实例的root账号设置相同的密码。

  jishu@Jishu:~/mysql$ sudo mysqladmin -u root password 123456 -S ./3306/mysql.sock
  mysqladmin: [Warning] Using a password on the command line interface can be insecure.
  Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
  jishu@Jishu:~/mysql$ sudo mysqladmin -u root  password 123456 -S ./3307/mysql.sock
  mysqladmin: [Warning] Using a password on the command line interface can be insecure.
  Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

3.2 创建Replication复制账号
  我们把端口为3306的实例作为主服务器,登录主服务器,创建Replication复制账号,并授予REPLICATION SLAVE权限。

  jishu@Jishu:~/mysql$ mysql -uroot -p123456 -S ./3306/mysql.sock
  mysql: [Warning] Using a password on the command line interface can be insecure.
  ......
  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  
  mysql> CREATE USER 'backup'@'localhost' IDENTIFIED BY '123456';
  Query OK, 0 rows affected (0.01 sec)
  
  mysql> GRANT REPLICATION SLAVE ON *.* TO 'backup'@'localhost' IDENTIFIED BY '123456';
  Query OK, 0 rows affected, 1 warning (0.01 sec)
  
  mysql> flush privileges;
  Query OK, 0 rows affected (0.01 sec)

3.3 创建数据库
  我们在多实例配置文件mysqld1实例的REPLICATION节中指定了执行Replication复制的数据库为musics,因此需要分别连接主实例和从实例,创建musics数据库。

  mysql> create database musics;
  Query OK, 1 row affected (0.00 sec)
  
  mysql> show databases;
  +--------------------+
  | Database           |
  +--------------------+
  | information_schema |
  | musics             |
  | mysql              |
  | performance_schema |
  | sys                |
  +--------------------+
  5 rows in set (0.01 sec)

3.4 配置主从Replication
  我们首先在主实例中查看master状态。

  mysql> show master status\G;
  *************************** 1. row ***************************
               File: mysql-binlog.000001
           Position: 1279
       Binlog_Do_DB: musics
   Binlog_Ignore_DB: 
  Executed_Gtid_Set: 
  1 row in set (0.00 sec)
  
  ERROR: 
  No query specified

  查看命令返回的结果的字段含义为:
  File: 主数据库记录事件的binary log文件名,在从数据库配置时需要用到;
  Position: 主数据库记录事件的binary log中的事件位置,会随着数据库的操作不断变化,所以在配置Replication时,一般需要锁定主数据库,配置完之后在解锁。这个参数在从数据库配置时需要用到也需要用到;
  Binlog-Do-DB: 执行Replication操作的数据库,我们配置为musics数据库;
  Binlog-Ignore-DB: 忽略Replication操作的数据库,我们没有配置。

  为了避免Position参数发生变化,我们先锁定主数据库。

  mysql> use musics;
  Database changed
  mysql> flush tables with read lock;
  Query OK, 0 rows affected (0.00 sec)

  我们把3307端口的实例作为从数据库。连接从数据库,进行配置。

  jishu@Jishu:~/mysql$ mysql -uroot -p123456 -S 3307/mysql.sock
  mysql: [Warning] Using a password on the command line interface can be insecure.
  ......
  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  
  mysql> stop slave;
  Query OK, 0 rows affected, 1 warning (0.00 sec)
  
  mysql> change master to master_host='127.0.0.1',master_user='backup',master_password='123456',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=1279;
  #这里要注意master_log_file和master_log_pos要和master一致
  Query OK, 0 rows affected, 2 warnings (0.06 sec)
  
  mysql> start slave;
  Query OK, 0 rows affected (0.01 sec)

  我们来看一下slave的状态。

  mysql> show slave status\G;
  *************************** 1. row ***************************
           Slave_IO_State: 
              Master_Host: 127.0.0.1
              Master_User: backup
              Master_Port: 3306
            Connect_Retry: 60
          Master_Log_File: mysql-bin.000001
      Read_Master_Log_Pos: 1279
           Relay_Log_File: Jishu-relay-bin.000003
            Relay_Log_Pos: 4
    Relay_Master_Log_File: mysql-bin.000001
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          Replicate_Do_DB: 
      Replicate_Ignore_DB: 
      ......

  slave状态查询结果中,如果Slave-IO-Running和Slave-SQL-Running的状态都是Yes时,表示主从数据库的Replication正常。Slave-IO-Running表示能连接到主库,并读取主库的binary log到本地,生成本地relay log文件;Slave-SQL-Running表示能读取本地relay log文件,并执行relay log里的SQL命令。
  如果查询结果中出现1236错误:

  ......
  Last_IO_Errno: 1236
  Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
  ......

  可以在从库上执行以下操作,即可正常。

  mysql> stop slave;
  Query OK, 0 rows affected (0.00 sec)
  
  mysql> reset slave;
  Query OK, 0 rows affected (0.02 sec)
  
  mysql> start slave;
  Query OK, 0 rows affected (0.03 sec)

  Replication运行正常后,要把主数据库解锁。

  mysql> unlock tables;
  Query OK, 0 rows affected (0.00 sec)

4.Replication测试
  在主数据库创建songs和albums两张表,然后到从数据库看是否也会生成这两张表,以测试Replication。
  连接主数据库,创建表格:

  mysql> create table tbl_songs(id int, name varchar(16));
  Query OK, 0 rows affected (0.04 sec)
  
  mysql> create table tbl_albums(id int, name varchar(32));
  Query OK, 0 rows affected (0.035 sec)
  
  mysql> show tables;
  +------------------+
  | Tables_in_musics |
  +------------------+
  | tbl_albums       |
  | tbl_songs        |
  +------------------+
  2 rows in set (0.00 sec)

  连接从数据库,查看表格:

  mysql> show databases;
  +--------------------+
  | Database           |
  +--------------------+
  | information_schema |
  | musics             |
  | mysql              |
  | performance_schema |
  | sys                |
  +--------------------+
  5 rows in set (0.00 sec)
  
  mysql> use musics;
  Reading table information for completion of table and column names
  You can turn off this feature to get a quicker startup with -A
  
  Database changed
  mysql> show tables;
  +------------------+
  | Tables_in_musics |
  +------------------+
  | tbl_albums       |
  | tbl_songs        |
  +------------------+
  2 rows in set (0.00 sec)

  数据库和两张表都已经同步,Replication功能正常。

如何在RTL级别电路建模优化congestion问题?

数字IC设计可谓环环相扣,很多环节都存在迭代发生的可能。

在最初芯片设计之前主要考虑PPA,即powerperformancearea,但是实际项目中还存在仿真测试后端实现的问题。

本文主要介绍RTL设计引入的后端实现过程中的布线(routing)问题。

后端物理实现需要完成芯片中布局布线(place&routing)的工作。在物理实现过程中routing之前的floorplan阶段placement阶段CTS阶段都对routing效果有很大的影响,也有很多针对congestion的优化技术。

但是,实际项目中依然存在走线无法绕通的问题,可能是因为芯片对利用率要求可能比较苛刻,也可能是因为在RTL级别建模电路时造成了难绕线问题。

芯片物理实现中的macro走线电源布线等占据走线资源,时序串扰也会给走线引入更多的问题,我们应该尽量减少由RTL级别电路建模引入的无法走线问题。

下面举两个在RTL级别优化电路走线问题的示例:

1、大扇入

reg [2:0] SEL ;
reg [127:0] A,B,C,D,E,F,G,H, SEL;
always@(*) begin
         case(SEL)
         2’b000:M <= A;
         2’b001:M <= B;
         2’b010:M <= C;
         2’b011:M <= D;
         2’b100:M <= E;
         2’b101:M <= F;
         2’b110:M <= G;
         2’b111:M <= H;
endcase
end

在上面的电路中一个MUX电路具有非常大的扇入(8X128=1024)。可以通过级联MUX优化走线问题:

2、大扇出

设计中还存在一种被广泛使用的信号,这种信号具有非常大的扇出,例如时钟、复位和使能等。

为了解决这个问题,可以复制信号源。这也体现了利于走线和硬件开销之间的折中。

上面这个有限状态机输出信号被多个模块使用,可以复制这个状态机,优化走线问题。

参考书籍:
数字IC设计——方法、技巧与实践

本文转载自公众号:芯片数字实验室
原文链接:https://mp.weixin.qq.com/s/obwFaM65\_yn7yoNZeJT48g
未经作者同意,请勿转载!

推荐阅读

  • 使用systemverilog验证仲裁器模块
  • 浅谈芯片系列1——ASIC和FPGA有什么区别?

想了解更多内容,欢迎关注芯片数字实验室专栏,由于工具,你可以专注在更重要的事情上。

一份难得的数据库市场分析报告

本文内容非商业用途可无需授权转载,请务必注明作者及本微信公众号、微博 @唐僧\_huangliang,以便更好地与读者互动。

目录

-数据库分类维度:关系型/非关系型、交易型/分析型

-NoSQL数据库的进一步分类

-OLTP市场规模:关系型数据库仍占营收大头

-数据库市场份额:云服务和新兴厂商主导NoSQL

-开源数据库 vs. 商业数据库

-数据库三大阵营:传统厂商和云服务提供商

最近由于时间原因我写东西少了,在公众号上也转载过几篇搞数据库朋友的大作。按说我算是外行,没资格在这个领域品头论足,而当我看到下面这份报告时立即产生了学习的兴趣,同时也想就能看懂的部分写点心得体会分享给大家。

可能本文比较适合普及性阅读,让数据库领域资深的朋友见笑了:)

来自Willian Blair__的《Database Software Market:The Long-Awaited Shake-up__》__,文末我会提供原报告出处。或者关注本公众号,从后台留言“database__”获取下载链接__。

数据库分类维度:关系型/非关系型、交易型/分析型

首先是分类维度,上图中的纵轴分类为Relational Database(关系型数据库,RDBMS)和Nonrelational Database (非关系型数据库,NoSQL),横轴的分类为Operational(交易型,即OLTP)和Analytical(分析型,即OLAP)。

按照习惯我们先看关系型数据库,左上角的交易型类别中包括大家熟悉的商业数据库Oracle、MS SQL Server、DB2、Infomix,也包括开源领域流行的MySQL(MariaDB是它的一个分支)、PostgreSQL,还有云上面比较常见的SQL Azure和Amazon Aurora等。

比较有意思的是,SAP HANA正好位于交易型和分析型的中间分界处,不要忘了SAP还收购了Sybase,尽管后者今天不够风光了,而早年微软的SQL Server都是来源于Sybase。Sybase的ASE数据库和分析型Sybase IQ还是存在的。

右上角的分析型产品中包括几款知名的列式数据仓库Pivotal Greenplum、Teradata和IBM Netezza(已宣布停止支持),来自互联网巨头的Google Big Query和Amazon RedShift。至于Oracle Exadata一体机,它上面运行的也是Oracle数据库,其最初设计用途是OLAP,而在后来发展中也可以良好兼顾OLTP,算是一个跨界产品吧。

再来看非关系型数据库,左下角的交易型产品中,有几个我看着熟悉的MongoDB、Redis、Amazon DynamoDB和DocumentDB等;右下角的分析型产品包括著名的Hadoop分支Cloudera、Hortonworks(这2家已并购),Bigtable(来自Google,Hadoop中的HBase是它的开源实现)、Elasticsearch等。

显然非关系型数据库的分类要更加复杂,产品在应用中的差异化也比传统关系型数据库更大。Willian Blair很负责任地对它们给出了进一步的分类。

NoSQL数据库的进一步分类

 

上面这个图表应该说很清晰了。非关系型数据库可以分为Document-based Store(基于文档的存储)、Key-Value Store(键值存储)、Graph-based(图数据库)、Time Series(时序数据库),以及Wide Cloumn-based Store(宽列式存储)。

我们再来看下每个细分类别中的产品:

文档存储:MongoDB、Amazon DocumentDB、Azure Cosmos DB等

Key-Value存储:Redis Labs、Oracle Berkeley DB、Amazon DynamoDB、Aerospike等

图数据库:Neo4j等

时序数据库:InfluxDB等

WideCloumn:DataStax、Cassandra、Apache HBase和Bigtable等

多模型数据库:支持上面不只一种类别特性的NoSQL,比如MongoDB、Redis Labs、Amazon DynamoDB和Azure Cosmos DB等。

OLTP市场规模:关系型数据库仍占营收大头

上面这个基于IDC数据的交易型数据库市场份额共有3个分类,其中深蓝色部分的关系型数据库(RDBMS,在这里不统计数据挖掘/分析型数据库)占据80%以上的市场。

Dynamic Database(DDMS,动态数据库管理系统,同样不统计Hadoop)就是我们前面聊的非关系型数据库。这部分市场显得小(但发展势头看好),我觉得与互联网等大公司多采用开源+自研,而不买商业产品有关。

而遵循IDC的统计分类,在上图灰色部分的“非关系型数据库市场”其实另有定义,参见下面这段文字:

数据库市场份额:云服务和新兴厂商主导NoSQL

请注意,这里的关系型数据库统计又包含了分析型产品。Oracle营收份额42%仍居第一,随后排名依次为微软、IBM、SAP和Teradata。

代表非关系型数据库的DDMS分类中(这里同样加入Hadoop等),云服务和新兴厂商成为了主导,微软应该是因为云SQL Server的基础而小幅领先于AWS,这2家一共占据超过50%的市场,接下来的排名是Google、Cloudera和Hortonworks(二者加起来13%)。

上面是IDC传统分类中的“非关系型数据库”,在这里IBM和CA等应该主要是针对大型机的产品,InterSystems有一款在国内医疗HIS系统中应用的Caché数据库(以前也是运行在Power小机上比较多)。我就知道这些,余下的就不瞎写了。

开源数据库 vs. 商业数据库

按照流行度来看,开源数据库从2013年到现在一直呈现增长,已经快要追上商业数据库了。

商业产品在关系型数据库的占比仍然高达60.5%,而上表中从这列往左的分类都是开源占优:

Wide Cloumn:开源占比81.8%;

时序数据库:开源占比80.7%;

文档存储:开源占比80.0%;

Key-Value存储:开源占比72.2%;

图数据库:开源占比68.4%;

搜索引擎:开源占比65.3%

 

按照开源License的授权模式,上面这个三角形越往下管的越宽松。比如MySQL属于GPL,在互联网行业用户较多;而PostgreSQL属于BSD授权,国内有不少数据库公司的产品就是基于Postgre哦。

数据库三大阵营:传统厂商和云服务提供商

前面在讨论市场份额时,我提到过交易型数据库的4个巨头仍然是Oracle、微软、IBM和SAP,在这里William Blair将他们归为第一阵营。

随着云平台的不断兴起,AWS、Azure和GCP(Google Cloud Platform)组成了另一个阵营,在国外分析师的眼里还没有BAT,就像有的朋友所说,国内互联网巨头更多是自身业务导向的,在本土发展公有云还有些优势,短时间内将技术输出到国外的难度应该还比较大。(当然我并不认为国内缺优秀的DBA和研发人才)

第三个阵容就是规模小一些,但比较专注的数据库玩家。

接下来我再带大家简单过一下这前两个阵容,看看具体的数据库产品都有哪些。

甲骨文的产品,我相对熟悉一些的有Oracle Database、MySQL以及Exadata一体机。

IBM DB2也是一个庞大的家族,除了传统针对小型机、x86(好像用的人不多)、z/OS大型机和for i的版本之外,如今也有了针对云和数据挖掘的产品。记得抱枕大师对Informix的技术比较推崇,可惜这个产品发展似乎不太理想。

微软除了看家的SQL Server之外,在Azure云上还能提供MySQL、PostgreSQL和MariaDB开源数据库。应该说他们是传统软件License+PaaS服务两条腿走路的。

如今人们一提起SAP的数据库就想起HANA,之前从Sybase收购来的ASE(Adaptive Server Enterprise)和IQ似乎没有之前发展好了。

在云服务提供商数据库的3巨头中,微软有SQL Server的先天优势,甚至把它移植到了Linux拥抱开源平台。关系型数据库的创新方面值得一提的是Amazon Aurora和Google Spanner(也有非关系型特性),至于它们具体好在哪里我就不装内行了:)

非关系型数据库则是Amazon全面开花,这与其云计算业务发展早并且占据优势有关。Google当年的三篇经典论文对业界影响深远,Yahoo基于此开源的Hadoop有一段时间几乎是大数据的代名词。HBase和Hive如今已不再是人们讨论的热点,而Bigtable和BigQuery似乎仍然以服务Google自身业务为主,毕竟GCP的规模比AWS要小多了。

最后这张DB-Engines的排行榜,相信许多朋友都不陌生,今年3月已经不是最新的数据,在这里列出只是给大家一个参考。该排行榜几乎在每次更新时,都会有国内数据库专家撰写点评。

以上是我周末的学习笔记,班门弄斧,希望对大家有帮助。

参考资料《Database Software Market:The Long-Awaited Shake-up》

https://blocksandfiles.com/wp…

扩展阅读:《_数据库&存储:互相最想知道的事_》

推荐阅读

  • 拒绝Precision 3540移动工作站的6个理由 (上)
  • Precision 3540移动工作站评测(SolidWorks & Revit实战)

本文转载自企业存储技术微信公众号原文链接点这里
注:本文只代表作者个人观点,与任何组织机构无关,如有错误和不足之处欢迎在留言中批评指正。 进一步交流技术可以加我的微信/QQ:490834312。
尊重知识,转载时请保留全文,并包括本行及如下二维码。感谢您的阅读和支持!《企业存储技术》微信公众号:HL_Storage,也欢迎关注企业存储技术极术专栏,定期更新。

拒绝Precision 3540移动工作站的6个理由 (上)

本文内容非商业用途可无需授权转载,请务必注明作者及本微信公众号、微博 @唐僧\_huangliang,以便更好地与读者互动。

目录(上、下篇)

– 专业的设备,就让它做专业的事

– 定位:2D和简单3D CAD、重载Excel用户

– 测试平台:对比台式PC和主流游戏显卡

– CPU Turboost超频设计和Super PI测试

– 显卡:究竟是Radeon Pro WX 2100还是3100?

– SolidWorks性能对比、什么是RealView?

– FSAA(全屏反锯齿)在3D设计软件中的应用

– BIM应用实测体验:Autodesk Revit

专业的设备,就让它做专业的事

工作站最初是为了图形设计、多媒体数字内容创作而生,所以我希望把评测重点放在这一块的实际功能体验上。当然我也想介绍一些别的方面,相信有读者朋友会感兴趣:)

随手拍的照片,效果不够好请大家见谅:)15__寸笔记本机身除了屏幕大,还有一个好处就是键盘的尺寸,比如这款3540__的右边可是有数字小键盘区哦。

Dell Precision 3540移动工作站,首先它也是一台15.6英寸的笔记本电脑。由于我之前上手过Latitude5480、5495等几款商用笔记本,3540工作站外壳质感是差不多的。不过这款15寸屏幕的边框比较窄,机身尺寸比较轻薄。

Precision 3540的重量只有4磅出头,也就是1.83kg。相比之下专门主打轻薄的15寸移动工作站5530也要1.78kg,而后者是定位在MacBook Pro这一级别的(操作习惯和软件生态有所不同)。相比之下,Dell 3540的性价比应该说是比较高的。

问题1:Precision 3540看上去和商用笔记本区别不大?

我们先简单看下这台3540的接口:

-1个交流电源接口;

– 1个USB 3.1 Gen 2 (USB Type-C) 端口,支持DisplayPort/Thunderbolt(雷电),也支持供电;

-3个USB 3.1 Gen 1 端口;

-1个microSD(TF)读卡器;

-1个耳机/麦克风端口;

-1个HDMI 端口;

-1个RJ-45千兆以太网接口

我个人比较喜欢这种端口设计,因为现在不少轻薄笔记本将USB换成Type-C、取消有线网口甚至HDMI,当你同时连接多个外设、投影机或者需要用网线调试有些设备时,不用带个Dock扩展坞还能方便一些。

移动工作站的主要目标人群也是企业和高端个人用户,这一点上和商用笔记本差不多。根据我的经验,商用产品在可靠性等方面的设计要求普遍比低端消费级PC__要高__,比如硬盘的选择、接口的稳固性等方面,我曾在《_论SSD蹭热点的姿势:20ms连续掉电测试,还是100万次开关机?_》有过相关讨论。

Precision 3540的后盖是由多个螺丝固定的。取下后可以看到内存、SSD/硬盘的维护都很方便。这台测试机原来安装了1条8GB内存,出于性能测试的考虑我换成了2条16GB。该机型的M.2接口支持NVMe(PCIe 3.0 x4)或者SATA SSD,随机带的512GB SATA我觉得够用了就没有换,本次测试的重点在于显卡和CPU。

定位:2D和简单3D CAD、重载Excel用户

在Dell官方资料中,对3540移动工作站的定位评价是:强大的2D、简单3D CAD(计算机辅助设计)和重载Excel用户。

-对于Excel表格而言,我觉得同等CPU、内存配置的高端商用笔记本也能胜任?这一点上移动工作站算是跨界了吧。

-2D图形设计,典型用户群应该是Photoshop、AutoCAD中的非3D应用等。显卡的2D性能至少在十几年前就没有瓶颈了,而屏幕的色彩表现往往更加重要,涉及到各种视觉内容的创意工作,特别是出版、印刷相关的。

-3D设计会真正考验显卡的性能,还有CPU,下文中我会给大家分享这部分测试。Precision3540配置的AMD Radeon Pro WX2100 2GB专业显卡,如果只看硬件规格上就是个入门级的水平,所谓“简单3D”到底能达到何种程度呢?

3540移动工作站在硬件上和商用笔记本最大的差别,除了这块专业显卡之外,就是100% sRGB色域的Premier Color液晶屏。我特地去查了Latitude 5500等型号商用笔记本只有另外几款45% NTSC级别屏幕可选。

在PremierColor中查看显示屏信息

Dell PremierColor软件可以从Windows 10应用商店下载,它只支持部分不低于100%sRGB色域显示屏的Precision和XPS系统。

sRGB的普及,是因为它能统一显示和打印两端的颜色标准,用户可实现所见即所得。

391-BEHN : 15.6__英寸 FHD WVA, 1920×1080, _防眩光非触控, 100% sRGB__(通过服务编码查到的配置)_

PremierColor软件中还能看到显示屏的液晶面板信息。比如这台Presision 3540使用的面板应该是来自LG。右边的具体色域范围指标中可以看出不同屏幕出厂调教的差异。

一块好的液晶面板固然重要,但出厂的色彩调校准确度也很关键,这方面Dell专业系列显示屏的口碑还是不错的,少数要求苛刻的用户还可以使用专门的校色设备(如“蜘蛛”)。

测试平台:对比台式PC和主流游戏显卡

 

为了和Precision 3540做性能对比,这次我并没有找一台普通的商用笔记本,也没有用入门级的台式工作站。Dell成铭系列PC没有配置专业显卡,不是专门针对图形设计用途的,也没有相关的兼容性认证。但客观地看,i5或者i7 CPU、中高端GeForce显卡确实被一些预算有限的轻量级设计用户所采纳,我也想借此机会对它们的性能做个比较。

问题2:低功耗配置的性能也会成倍下降吗?

Core i5-8500是一款6核65W处理器,基础频率比3540移动工作站的4核15W i7-8565U高出不少,多线程性能领先是必然的。不过i7-8565U的最高TurboBoost超频支持到4.6GHz(单核),我们知道不少CAD设计软件日常的图形交互操作还是单线程的,那么实际表现又是怎样呢?

入门级的Radeon Pro WX 2100虽然有专业显卡的血统,但用于台式机的GeForce GTX 1060无论显存容量还是功耗都是前者数倍。在这样的配置下,移动工作站还能体现出它的价值吗?

至于系统内存容量,都是双通道和DDR4-2667速率,我实际测试的模型没有太大的,16GB容量足够应付。

CPU Turboost超频设计和Super PI测试

这个截图是我在Core i7-8565U上运行Intel Extreme Tuning Utility,对于绝大多数笔记本的用户我并不推荐拿这个软件去做什么调整,因为现在Intel CPU自己预置的性能/电源管理调节机制已经相当成熟,但用来监测CPU实时温度和功耗还是不错的。

虽然i7-8565U的TDP只有15W,但短时Turbo Boost功耗支持到51W,限制是最长不超过28秒。在散热和CPU温度允许的情况下,更长时间的Turbo Boost功耗为25W。

Super PI是个非常知名的CPU单线程计算测试,如上图,Super PI进程实际的CPU占用率保持在25%(也就是用满了1个核心)。此时i7-8565U的频率可以超过4.4GHz,下面看看性能数字:

Core i7-8565U__运行Super PI__一百万位计算,耗时8.219__秒

Core i5-8500__运行Super PI__一百万位计算,耗时9.422__秒

以上只是先做个理论基础的验证,15W TDP的i7-8565U确实可以拥有比较优秀的单线程性能。

显卡:究竟是Radeon Pro WX 2100还是3100

由于图形工作站应用软件有不少是基于OpenGL 3D API的,所以在评价专业显卡性能特别是和消费级显卡对比时不应只看硬件指标。由于这款移动显卡的节电设计,在轻负载(基本没处理3D)时PCIe接口速率下调至x2 1.1。

问题3:独立显卡为什么走PCIe 3.0 x8

同时我也看到了这块Radeon Pro WX 2100采用PCIe x8的设计。之前已经有资深媒体评测指出,由于8代U结尾笔记本CPU采用集成PCH的单芯片双Die设计,6,Dell Precision 3540选择将其中的x8分给M.2 NVMe SSD和TB3雷电接口,以保证这部分的性能。

至于入门级专业显卡Radeon Pro WX 2100,PCIe 3.0 x8足够它使用了。我对这一点比较有把握,因为曾经在速度只有一半的雷电接口(相当与PCIe x4)上测试过更高端的显卡。

专业图形工作站的一大优势是ISV认证,可以保证硬件对应用软件最好的兼容性,并且在出现问题时能获得充分的技术支持。

上图是我在达索SolidWorks网站查询,已经可以看到Dell品牌下面有Precision 3540这一项。

不过到了显卡这里,型号却变成了WX 3100?认证驱动版本号是AMD公版的19.Q2。

经过尝试,只有使用Dell网站下载的显卡驱动安装,型号才能显示为Radeon Pro WX 2100,估计AMD为Precision 3540机型提供了专门定制的显卡,其Vendor ID与之前的WX 3100相同。不过,既然ISV软件厂商都认证过了,我们也没必要去纠结这个型号的显示…

未完待续

下篇中(SolidWorks和Revit实战)还会讨论余下的3个理由:

问题4:使用Direct3D的设计软件还需要专业显卡吗?

问题5:入门级专业显卡能跑动多大模型?

问题6:3540移动工作站胜任不了哪些应用…

推荐阅读

  • Optane SSD 900P评测(2):比拼4x闪存NVMe RAID0
  • Optane SSD 900P评测(3):一个非典型8K视频编辑方案

本文转载自企业存储技术微信公众号原文链接点这里
注:本文只代表作者个人观点,与任何组织机构无关,如有错误和不足之处欢迎在留言中批评指正。 进一步交流技术可以加我的微信/QQ:490834312。
尊重知识,转载时请保留全文,并包括本行及如下二维码。感谢您的阅读和支持!《企业存储技术》微信公众号:HL_Storage,也欢迎关注企业存储技术极术专栏,定期更新。

Wi-Fi iot智能家居套件 开箱 + hello world

收到板子有一周了吧,这周时间也不是很多,抽空下班回来看看,大概了解了怎么在这套平台上编写业务代码

下面先给大家看看收到的板子吧

包装纸箱里面有很多气泡袋,板子被保护非常安全

接下来是个盒子,里面就是鸿蒙的开发套件

打开盒子分为上下两层,装着所有的配件以及板子。

组合起来像是一个带翅膀的飞机,就像鸿蒙就要飞起来。上电以后屏幕上显示出里面的测试程序,开始我的鸿蒙之旅。

有了板子以后需要搭建环境。

首先是linux win10自带的子系统wsl,看了教程以后发现应该是可以在wsl上编译,

接下来要安装wsl ,https://docs.microsoft.com/zh…

参考官方教程我安装的ubuntu18.04

安装完成wsl,配置鸿蒙编译环境

搭建环境,参考华为的官方介绍https://device.harmonyos.com/…

当然一下子没安装好,找来找去发现了https://device.harmonyos.com/…

解决了我所有问题,可以正常进行编译了,

因为我一开始电脑上就有VSCode,就不用了安装直接进行编辑hello world!和点灯程序

下载本来想用VSCode的插件,奈何死活没配置好,最终还是用了HiBrun

参考:

hello world:https://device.harmonyos.com/…

点灯教程:https://harmonyos.51cto.com/p…

烧录进去然后

断开HiBurn连接,连上我的串口助手,按复位按键

宣告成功!!!!!!

后续准备做一个关于这个板子的上位监控软件,可以查看到所有的数据,以及控制下位的板子。


作者:mb5f86e073222c1

获取文中资源包,请点击下方链接跳转至原网站下载
转自:https://harmonyos.51cto.com/p…

关于Scikit-Learn,你不一定知道的10件事

作者:Rebecca Vickery
编译:ronghuaiyang
首发:AI公园公众号

导读

Scikit-learn中有很多方便的功能,你不一定知道。

Scikit-learn是使用最广泛的Python机器学习库之一。它有一个标准化和简单的接口用来预处理数据和进行模型的训练,优化和评估。

该项目最初是由David Cournapeau开发的谷歌Summer of Code项目,并在2010年首次公开发布。自创建以来,这库已经发展成为一个丰富的生态系统,用于开发机器学习模型。

随着时间的推移,该项目开发了许多方便的功能,增强了其易用性。在本文中,我将介绍10个你可能不知道的最有用的特性。

1. Scikit-learn 有内置的数据集

Scikit-learn API有多种内置的toy和现实世界数据集。只需一行代码就可以访问这些函数,如果你正在学习或只是想快速尝试一些新功能,那么它们非常有用。

你还可以使用生成器方便地为回归make_regression()、聚类make_blobs()以及分类make_classification()生成合成数据集。

所有的加载工具都提供了返回已经分割成X(特征)和y(目标)的数据的选项,这样就可以直接使用它们来训练模型。

# Toy regression data set loadingfrom sklearn.datasets import load_bostonX,y = load_boston(return_X_y = True)# Synthetic regresion data set loadingfrom sklearn.datasets import make_regressionX,y = make_regression(n_samples=10000, noise=100, random_state=0)

2. 第三方公开数据集获取也很方便

如果你想通过Scikit-learn直接访问更多公开可用的数据集,有一个方便的函数可以让你直接从openml.org网站导入数据。这个网站包含超过21,000种不同的数据集,用于机器学习项目。

from sklearn.datasets import fetch_openmlX,y = fetch_openml("wine", version=1, as_frame=True, return_X_y=True)

3. 有现成的分类器来训练基线模型

在开发机器学习模型时,明智的做法是首先创建一个基线模型。这个模型本质上应该是一个“伪”模型,比如总是预测最经常出现的类。这为你的“智能”模型提供了一个基准,这样你就可以确保它比随机结果表现得更好。

Scikit-learn中包含用于分类任务的 DummyClassifier()和用于回归问题的DummyRegressor()

from sklearn.dummy import DummyClassifier# Fit the model on the wine dataset and return the model scoredummy_clf = DummyClassifier(strategy="most_frequent", random_state=0)dummy_clf.fit(X, y)dummy_clf.score(X, y)

4. Scikit-learn 有自己的绘图 API

Scikit-learn有一个内置的绘图API,它允许你在不导入任何其他库的情况下可视化模型性能。包括下列绘图功能:部分依赖图、混淆矩阵、精确度召回率曲线和ROC曲线。

import matplotlib.pyplot as plt from sklearn import metrics, model_selectionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_breast_cancerX,y = load_breast_cancer(return_X_y = True)X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)clf = RandomForestClassifier(random_state=0)clf.fit(X_train, y_train)metrics.plot_roc_curve(clf, X_test, y_test)plt.show()

5. Scikit-learn 具有内置的特征选择方法

提高模型性能的一种方法是只使用最好的特征集来训练模型,或者去除冗余的特征。这个过程称为特征选择。

Scikit-learn有许多函数来进行feature selection。其中一个是SelectPercentile()。该方法根据所选择的统计方法选择表现最好的X百分位特征进行评分。

from sklearn import model_selectionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_winefrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.feature_selection import SelectPercentile, chi2X,y = load_wine(return_X_y = True)X_trasformed = SelectPercentile(chi2, percentile=60).fit_transform(X, y)

6. Pipelines 可以让你把所有的机器学习工作流串到一起

除了为机器学习提供广泛的算法,Scikit-learn也有一系列的预处理和数据变换的功能。为了便于机器学习工作流的重现性和简单性,Scikit-learn创建了**pipeline **,它允许你将大量的预处理步骤与模型训练阶段链接在一起。

pipeline将工作流中的所有步骤存储为单个实体,可以通过fit和predict方法调用。在pipeline对象上调用fit方法时,将自动执行预处理步骤和模型训练。

from sklearn import model_selectionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_breast_cancerfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerX,y = load_breast_cancer(return_X_y = True)X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)# Chain together scaling the variables with the modelpipe = Pipeline([('scaler', StandardScaler()), ('rf', RandomForestClassifier())])pipe.fit(X_train, y_train)pipe.score(X_test, y_test)

7. 使用ColumnTransformer,你可以对不同的特征应用不同的预处理

在许多数据集中,你将拥有不同类型的特征,需要应用不同的预处理步骤。例如,数据集中可能混合有分类数据和数值数据,你可能希望通过独热编码将分类数据转换为数值数据并缩放数值变量。

Scikit-learn pipeline中有一个函数ColumnTransformer,可以让你非常容易地通过索引或通过指定的列名来指定哪些列应用最合适的预处理。

from sklearn import model_selectionfrom sklearn.linear_model import LinearRegressionfrom sklearn.datasets import fetch_openmlfrom sklearn.compose import ColumnTransformerfrom sklearn.pipeline import Pipelinefrom sklearn.impute import SimpleImputerfrom sklearn.preprocessing import StandardScaler, OneHotEncoder# Load auto93 data set which contains both categorical and numeric featuresX,y = fetch_openml("auto93", version=1, as_frame=True, return_X_y=True)# Create lists of numeric and categorical features  numeric_features = X.select_dtypes(include=['int64', 'float64']).columnscategorical_features = X.select_dtypes(include=['object']).columnsX_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)# Create a numeric and categorical transformer to perform preprocessing stepsnumeric_transformer = Pipeline(steps=[    ('imputer', SimpleImputer(strategy='median')),    ('scaler', StandardScaler())])categorical_transformer = Pipeline(steps=[    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),    ('onehot', OneHotEncoder(handle_unknown='ignore'))])# Use the ColumnTransformer to apply to the correct featurespreprocessor = ColumnTransformer(    transformers=[        ('num', numeric_transformer, numeric_features),        ('cat', categorical_transformer, categorical_features)])# Append regressor to the preprocessorlr = Pipeline(steps=[('preprocessor', preprocessor),                      ('classifier', LinearRegression())])# Fit the complete pipelinelr.fit(X_train, y_train)print("model score: %.3f" % lr.score(X_test, y_test))

8. 你可以简单的输出一个HTML来表示你的pipeline

pipeline通常非常复杂,特别是在处理真实数据时。因此,Scikit-learn提供了一个方法来输出pipeline中步骤的HTML图,这非常方便。

from sklearn import set_configset_config(display='diagram')   lr

9. 有一个绘图函数来可视化决策树

plot_tree()函数允许你创建一个决策树模型中的步骤图。

import matplotlib.pyplot as plt from sklearn import metrics, model_selectionfrom sklearn.tree import DecisionTreeClassifier, plot_treefrom sklearn.datasets import load_breast_cancerX,y = load_breast_cancer(return_X_y = True)X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)clf = DecisionTreeClassifier()clf.fit(X_train, y_train)plot_tree(clf, filled=True)plt.show()

10. 有许多第三方的库可以扩展Scikit-learn的功能

许多第三方库都可以使用Scikit-learn并扩展其功能。其中两个例子包括category-encoders库,它为分类特征提供了更广泛的预处理方法,以及ELI5库,用于更好的模型可解释性。

这两个包也可以直接在Scikit-learn pipeline中使用。

—END—

英文原文:https://towardsdatascience.co…

推荐阅读

  • CVPR 2020:物体检测论文精选
  • 对比自监督学习
  • TensorFlow中最大的30个机器学习数据集
  • 实体链接:信息抽取中的NLP的基础任务

关注图像处理,自然语言处理,机器学习等人工智能领域,请点击关注AI公园专栏
欢迎关注微信公众号

AI:我又又又打败了人类冠军!小学生:叫爸爸!

看到“双节”期间中国有5.5亿人出行的新闻,我不由得虎躯一震。想到了人会多,但没想到会这么多!看来大家都充满了探索欲,希望在难得的假期去往自己熟悉或未知的地方。

就算你选择了“家里蹲”,也一定会通过网上冲浪、阅读游戏等方式,来探索自己的内心世界。

探索是人类的本能,从婴儿时期开始,好奇心就驱动着我们去探索并理解自己所在的世界, AI的成长则离不开对人类的观察与模仿,其中,就包括探索的能力。

这种能力被算法掌握之后,出现了阿尔法狗打败人类棋圣,也出现了OpenAIFive——在电子游戏领域完虐人类玩家。不过即便如此,人类的探索能力依然令最高级的AI都望尘莫及。

比如婴儿可以从爬行和探索中学会认知三维空间,而一些计算机视觉还总被曝出被平面照片所欺骗过去的新闻,上马更高性能的3D视觉算法则需要耗费巨大的算力资源,从这个角度看,人脑无疑在效果和效率上都碾压了AI。

那么,能不能引入儿童的学习能力,来实现更聪明的AI呢?这个猜测,就像是“把爱因斯坦的大脑给我我也能拿诺贝尔奖”一样,是一个有点铁憨憨,又有点重要的问题。

5岁小孩碾压AI,“玩”就够了

大家不妨在假期做一个生活观察,看看小孩子们是如何探索世界的?

如果一个玩具看起来有很多玩法,但他们不知道哪一个是正确的,小孩子们会进行假设驱动的探索,如果“假设”失败了,他们就会转向新的玩具。

有研究显示,一个11个月大的婴儿,在看到许多违反物理定律的现象时,会忍不住对其进行更多的探索,甚至会做出一些违规行为来实践自己的假设。

比如看到一辆漂浮在空中的汽车,有点颠覆以往的认知了,你会怎么做?婴儿会选择将玩具砰地扔到桌子上,想知道这种“不合常理”的情况是怎么出现的(所以阻止熊孩子弄坏你手办的唯一办法,就是根本不要让他们看到它们)。

这种“不见黄河心不死”式的自由探索,有时会令家长和大人们不堪其扰,但抽象化的“假设”能够让人类做出大量预测,想象出许多新的可能性,不仅是一种极为有意义的学习方式,更是人类创造力的由来。

不过就像小王子觉得枯燥的大人们看不到“蟒蛇肚子里的大象”一样,令人遗憾的是,这种探索能力是幼儿的专长,大部分情况下只存在在5岁以前,这也让他们成为宇宙中最好的学习者。

既然儿童行为如此有参考意义,科学家们自然也想得到。事实上,儿童发展学对AI的进展起到了重要的方向牵引作用。

科学家们曾将好奇心引入神经网络,打造了深度增强学习,通过奖励反馈来鼓励智能体(agent)主动探索和理解环境,更新模型参数。这让AI能够自主获得技能,在电子游戏等需要通用智能的复杂场景中能够做出自己的决策,而不是人类预先通过庞大的标注数据集给定答案。

其他类型的儿童行为亦有价值。前面提到的“不见黄河心不死”的探索,就被化作深度优先搜索策略,DeepMind和加州大学伯克利分校的研究人员,开发了一个3D导航和解谜环境。智能体(agent)沿着特定路径进行探索,如果遇到死胡同,那就回去找到下一条没有探索过的道路,继续前进。

听起来是不是很像小孩子走迷宫的游戏?这能让智能体接触到各种各样的经验,在信息较少的环境中工作;减少对数据量的依存,改变目前算力资源紧张的局面,让许多小数据、少样本的领域(如金融、医疗)也能实现智能化。

将儿童探索行为应用于AI,一切都能变得更好,理想层面上确实如此,但现实总喜欢跟科学家们开玩笑,也算是给人类保留了一个“杀手锏”吧。

AI能力暴涨的当下,人类为什么还能稳坐智慧王座?

需要注意的是,这些类似儿童探索的策略,通常更多被用在训练期间提高代理人的经验值,而不是在决策时支持快速学习和探索。用人话说就是“懂得了许多道理,却不一定能过好这一生”,因为一到关键选择时刻就会掉链子。

就拿前面提到的深度优先搜索(DFS)来说,科学家们发现,如果让孩子们自由探索,那么他们与智能体按DFS做出的行动有90%的相似,而以目标为导向(找到橡皮糖)来探索的话,有96%的路线都是相似的。但不同的是,探索越多的孩子,最后能花费更少的时间完成任务,智能体却相反。

如果智能体发现一个地方很有趣(能得到奖励),就会一直重新访问该区域,直到它终于终于终于觉得那里不再有趣了,这会导致其概括性不佳(无法形成最佳策略)。

其中的差别就在于,孩子不是被动地孤立学习或由目标驱动,而是在不断实验和收集信息,将自己的认知和经验与获得的信息结合起来,编织出一个丰富的世界模型。而即使最复杂的机器探索方法,也只能为特定的目标服务,一时半会还无法完美匹配这个充满了各种“意外”的真实世界。

为什么有了一定的探索能力,AI智能体的表现还是不尽如人意呢?

首当其冲就是实验室与现实环境的巨大不同。

深度强化学习过去都是“机上谈兵”,不是跟人类在二维游戏里PK,就是数字网格里下棋,而儿童的探索则是发生在信息丰富的三维现实世界之中,许多潜在因素很难被应用到实验中。

这也是为什么,当今最强大的AI智能机器人也达不到一个仅小学毕业的优秀人类服务员的工作能力,能像他们一样快速适应环境、完成各种复杂任务。

此外,儿童的发展心理学研究很难在AI产业链中形成“闭环”。要真正激发AI生长出服务现实的能力,不仅要构建出具有更强探索能力的智能体,还要继续学习人类的认知能力,推进人工智能自身的理论创新和软硬件升级(比如搭建三维训练环境),这一系列链式突破,才能最终将技术构想转化为现实生产力。“大力出奇迹”的深度学习,其高光时刻就是这么来的。

沿着这个方向,我们可以进一步了解,怎样才能弥合智能体与人类之间的差距。

下一代AI,逐渐浮出迷雾的真实未来

在过去的数年里,深度学习做到了传统算法所无法企及的进度,催生了大量的工业界应用,但其实,现在的深度学习还是很傻——举个例子,大部分人都可以通过几十个小时的学习学会开小汽车,而完全自动的L5级无人汽车至今还是个遥远的梦。

图灵奖得主Geoffrey Hinton就一直非常渴望找到一种新的实现深度网络的方法,认为目前(最广泛的反向传播算法)根本不是大脑的工作机制。

另一位图灵奖得主Yann Lecun,就认为在某些游戏中,需要大量增加模型训练时间才能达到或超过专业人类玩家的水平。

通过儿童的学习模式,发现当前最优秀的AI也比不上5岁小孩的智力,或许我们可以回答“下一代AI应该是什么样”,这个神经网络最重要的未解难题之一。

至少要有两重升级:

1.有意识。目前公认文字表达能力最高、模型最为庞大的GPT-3也曾被专家吐槽是“无脑作业”,其实并不真正理解自己写出的句子。而具有自主探索、决策、推理能力的AI,可以理解自己周围的环境,才是真正的人工智能。

2.能效比。为什么即使存在缺陷,依然没有妨碍深度学习带领AI进来发展热潮呢?核心原因就在于深度神经网络大幅度降低了全社会处理、挖掘、应用大数据的成本。相对人脑而言,现有的计算硬件功耗都很高,不断提升AI性价比,是避免再次陷入寒冬的唯一方法,也在呼唤更高级的算法。

这两个基本难题,只能交给科学家和工程师们在针尖上做大文章了。对于我们普通人来说,保有一颗如儿童般对世界的好奇心,触碰充满各种信息的大自然,由此得来的系统认知与思维能力,或许才是机器永远无法企及,且弥足珍贵的。

这个假期,你们都有过哪些有趣的探索呢?快来评论区告诉我呀!

Nvidia GPU不同架构L1 cahce的一些区别

按照经验来看,GPU通常使用两级的缓存机制,L2是所有SM/CU共用,L1一般是单个SM/CU独自享用,nvidia不同GPU架构在L1的设计上也有一些差异,太久没用容易忘记,这里简要记录下。

1、Kepler(开普勒架构)

1.1、通常情况下L1 CACHE主要用于对local内存进行缓存(寄存器溢出和栈的使用),如果寄存器溢出而local内存跟global内存一样是超级慢的,那简直就是灾难,所以用L1做缓存会有比较大的优势,不过应该很少出现这种情况,除非kernel比较复杂;global内存加载只能在L2进行缓存(或者放置到只读数据缓存)。

注:有通常情况就有例外:例外的情况就是global加载支持L1缓存,需要给nvcc传递一些参数:-Xptxas -dlcm=ca,不过需要额外注意的是只有部分GPU可以这么操作,例如以GK110B芯片设计的显卡

1.2、L1和shared memory是共用的,且可以做一定几种情况的配置,例如48K+16K,或者32K+32K等情况,部分芯片的L1/shared可能比较大,不过单个thread block仍然只能只用48K。超过kernel launch会失败。

1.3、使用L1做缓存的时候,如果启用-Xptxas -dlcm=ca编译模式,需要注意cache的粒度是128字节的,其他情况下是32字节的。

2、Maxwell(麦克斯韦架构)

2.1、该架构对L1和Texture Cache进行合并,而且跟开普勒架构也有较大差异,local内存加载和global内存加载仅仅只能利用L2做数据缓存(作为例外,global内存加载想使用L1,技巧跟开普勒架构一样),从这代开始,L1/Texture Cache对warp的内存请求进行合并访问。

3、Pascal(帕斯卡架构)

3.1、该架构对L1和Texture Cache也是进行合并的,对于GP100不过global内存的加载默认使用L1/Texture Cache。不过GP104跟麦克斯韦架构一样,需要做额外配置nvcc那些参数才能对global内存加载使用L1缓存。

3.2、对于L1缓存,该架构的粒度都是32字节的;与开普勒相同,local内存加载是在L1缓存。

4、Volta(伏打架构)

4.1、伏打架构的L1/Texture cache/shared memory是合并在一起的。

4.2、伏打架构的L1最大到128K。跟开普勒一样,L1和shared memory也是可以配置不同大小的。

5、turing(图灵架构)

5.1、图灵架构与伏打架构的L1 cache行为进行小幅优化,并没有太大差异。L1和shared memory同样可以进行一些不同大小的配置。

总之,对于L1,nvidia不同架构上还是有一些差异,但是对于优化这个事情从来都是没有止境的,有时候对L1的一些细节

理解可能对优化还是有一些帮助。

作者:Keepin
授权转自知乎,请勿二次转载。

推荐专栏文章

  • 快速评估算法对GPU性能需求(入门篇)
  • Arm mali gpu四大微架构概述

更多嵌入式AI算法部署等请关注极术嵌入式AI专栏